package com.fengniaoxls.fengniaonewretail.jpush.voice;

import android.text.TextUtils;

import com.fengniaoxls.fengniaonewretail.utils.LogUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * 音频播放模板处理类
 *
 * @author Administrator
 * @date 2018/10/9
 */

public class VoiceTemplate {
    private static final String DOT = ".";

    private String numString;
    /**
     * 收款成功音频
     */
    private String prefix;
    /**
     * 元的音频
     */
    private String suffix;

    public VoiceTemplate() {

    }

    /**
     * 获取播放的音频文件顺序集合
     *
     * @param money
     * @return
     */
    public static List<String> getDefaultTemplate(String money) {
        return new VoiceTemplate()
                .prefix("success")
                .numString(money)
                .suffix("yuan")
                .gen();
    }

    public String getPrefix() {
        return prefix;
    }

    public VoiceTemplate prefix(String prefix) {
        this.prefix = prefix;
        return this;
    }

    public String getSuffix() {
        return suffix;
    }

    public VoiceTemplate suffix(String suffix) {
        this.suffix = suffix;
        return this;
    }


    public String getNumString() {
        return numString;
    }

    public VoiceTemplate numString(String numString) {
        this.numString = numString;
        return this;
    }


    public List<String> gen() {
        return genVoiceList();
    }

    private List<String> createReadableNumList(String numString) {
        List<String> result = new ArrayList<>();
        if (!TextUtils.isEmpty(numString)) {
            int len = numString.length();
            for (int i = 0; i < len; i++) {
                if ('.' == numString.charAt(i)) {
                    result.add("dot");
                } else {
                    result.add(String.valueOf(numString.charAt(i)));
                }
            }
        }
        return result;
    }


    /**
     * 播放音频文件顺序
     *
     * @return
     */
    private List<String> genVoiceList() {
        List<String> result = new ArrayList<>();
        if (!TextUtils.isEmpty(prefix)) {
            result.add(prefix);
        }
        if (!TextUtils.isEmpty(numString)) {
            result.addAll(genReadableMoney(numString));
        }

        if (!TextUtils.isEmpty(suffix)) {
            result.add(suffix);
        }
        return result;
    }

    /**
     * 拆分金额成一个集合，以对应音频文件
     *
     * @param numString
     * @return
     */
    private List<String> genReadableMoney(String numString) {
        List<String> result = new ArrayList<>();
        if (!TextUtils.isEmpty(numString)) {
            /**
             * contains（）返回TRUE时，该字符串中存在该字符
             * 此处判断字符串是否包含小数点
             */
            if (numString.contains(DOT)) {
                String integerPart = numString.split("\\.")[0];
                String decimalPart = numString.split("\\.")[1];
                //整数部分
                List<String> intList = readIntPart(integerPart);
                //小数点之后的部分
                List<String> decimalList = readDecimalPart(decimalPart);
                result.addAll(intList);
                if (!decimalList.isEmpty()) {
                    result.add("dot");
                    result.addAll(decimalList);
                }
            } else {
                //int
                result.addAll(readIntPart(numString));
            }
        }
        return result;
    }

    /**
     * 拆分小数点后面字符串
     *
     * @param decimalPart
     * @return
     */
    private List<String> readDecimalPart(String decimalPart) {
        List<String> result = new ArrayList<>();
        if (!"00".equals(decimalPart)) {
            char[] chars = decimalPart.toCharArray();
            for (char ch : chars) {
                result.add(String.valueOf(ch));
            }
        }
        return result;
    }

    /**
     * 当金额为整数时，直接拆分，拆分成
     *
     * @param integerPart
     * @return
     */
    private List<String> readIntPart(String integerPart) {
        List<String> result = new ArrayList<>();
        String intString = readLong(Long.parseLong(integerPart));
        int len = intString.length();
        for (int i = 0; i < len; i++) {
            char current = intString.charAt(i);
            if (current == '拾') {
                result.add("ten");
            } else if (current == '佰') {
                result.add("hundred");
            } else if (current == '仟') {
                result.add("thousand");
            } else if (current == '万') {
                result.add("ten_thousand");
            } else if (current == '亿') {
                result.add("ten_million");
            } else {
                result.add(String.valueOf(current));
            }
        }
        return result;
    }


    private static final char[] NUM = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
    private static final char[] CHINESE_UNIT = {'元', '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', '拾', '佰', '仟'};

    /**
     * 返回关于钱的中文式大写数字,支仅持到亿,超过亿则需要使用长整型long
     */
    public static String readLong(long moneyNum) {
        long mMoneyNum = moneyNum;
        String res = "";
        int i = 0;
        if (moneyNum == 0) {
            return "0";
        }

        if (moneyNum == 10) {
            return "拾";
        }

        if (moneyNum > 10 && moneyNum < 20) {
            return "拾" + moneyNum % 10;
        }

        while (moneyNum > 0) {
            res = CHINESE_UNIT[i++] + res;
            res = NUM[(int) (moneyNum % 10)] + res;
            moneyNum /= 10;
        }
        /**
         * replaceAll() 方法使用给定的参数 replacement 替换字符串所有匹配给定的正则表达式的子字符串。
         * 参数
         * 第一个参数：regex -- 匹配此字符串的正则表达式。
         * 第二个参数：newChar -- 用来替换每个匹配项的字符串。
         * 成功则返回替换的字符串，失败则返回原始字符串。
         */
        if (mMoneyNum >= 100000000) {
            //整亿
            if (mMoneyNum % 100000000 == 0) {
                return res.replaceAll("0[拾佰仟万]", "0")
                        .replaceAll("0+亿", "亿").replaceAll("0+万", "万")
                        .replaceAll("0+元", "元").replaceAll("0+", "0")
                        .replace("元", "");
            } else {
                //非整亿，有万位或者千位（这里万位包括万、十万、百万、千万位）
                String a = String.valueOf(mMoneyNum);
                LogUtils.e("原始数据--》" + a);
                LogUtils.e("截取万位--》" + a.substring(a.length() - 8, a.length() - 4));
                if (Long.parseLong(String.valueOf(mMoneyNum).substring(String.valueOf(mMoneyNum).length() - 8, String.valueOf(mMoneyNum).length() - 4)) == 0) {
                    //万位为全部为0的情况，例如 1500002000.00 此情况不需要读出 万，直接读一十五亿零二千元
                    return res.replaceAll("0[拾佰仟]", "0")
                            .replaceAll("0+亿", "亿").replaceAll("0+万", "0")
                            .replaceAll("0+元", "元").replaceAll("0+", "0")
                            .replace("元", "");

                } else {
                    //万位为不为0的情况，例如  1520002000.00 此情况需要读出 万，读一十五亿二千万二千元
                    return res.replaceAll("0[拾佰仟]", "0")
                            .replaceAll("0+亿", "亿").replaceAll("0+万", "万")
                            .replaceAll("0+元", "元").replaceAll("0+", "0")
                            .replace("元", "");
                }
            }
        } else {
            //小于一亿
            return res.replaceAll("0[拾佰仟]", "0")
                    .replaceAll("0+亿", "亿").replaceAll("0+万", "万")
                    .replaceAll("0+元", "元").replaceAll("0+", "0")
                    .replace("元", "");
        }
    }

}
